
const Layer = require('./layer')
const methods = require('methods')

function Route() { // method 维度
    this.stack = []
    this.methods = {} // 优化 当前route包含的请求方式 没有时直接下一个layer
}

Route.prototype.dispatch = function (req, res, out) { // 匹配 route中的 请求方式 一样的 layer 并执行用户传入的fn 如果没有命中 调用out 去寻找下一个层的layer
    let i = 0;
    const next = (err) => {
        if (err) return out(err) // 出错时 退出当前route  进入上层的下一个layer
        req.method === 'POST' && console.log('post执行了')
        if (i === this.stack.length) return out()  // out 为 path维度layer的下一个layer
        let layer = this.stack[i++]
        if (layer.method === req.method.toLowerCase()) {  // 请求方式一样 调用用户传入的fn 传入next方法
            layer.handler(req, res, next)
        } else {
            next()
        }
    }

    next()
}

methods.forEach(method => {
    Route.prototype[method] = function (handlers) {
        handlers.forEach(handler => {
            let layer = new Layer('/', handler)
            layer.method = method
            this.methods[method] = true
            this.stack.push(layer)
        })
    }
})



module.exports = Route